package godbc

//在Golang中你用sql.DB访问数据库。你可以使用此类型创建语句和事务，执行查询，并获取结果
//要使用 database/sql，你需要 database/sql 自身，以及需要使用的特定的数据库驱动。
//你通常不应该直接使用驱动包，尽管有些驱动鼓励你这样做。(在我们看来，这通常是个坏主意。) 相反的，如果可能，
//你的代码应该仅引用 database/sql 中定义的类型。这有助于避免使你的代码依赖于驱动，
//从而可以通过最少的代码来更改底层驱动(因此访问的数据库)。它还强制你使用Golang习惯用法，而不是特定驱动作者可能提供的特定的习惯用法。
import (
	"database/sql"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"time"
)


type Area struct {
	Id int64  `sql:id`
	AreaName string  `sql:area_name`
}


//Connect db by dataSourceName e.g. "user:password@tcp(127.0.0.1:3306)/dbname"
func Connect(dataSourceName string) (*sql.DB, error) {
	conn, err := sql.Open("mysql", dataSourceName)
	if err != nil {
		return nil, err
	}
	//设置连接池
	conn.SetMaxOpenConns(100)
	conn.SetMaxIdleConns(10)
	conn.SetConnMaxLifetime(10 * time.Minute)
	return conn, conn.Ping()
}

func RunTx() {
	db, err := Connect("root:fan1988@tcp(127.0.0.1:3306)/sharding_jdbc")
	if err != nil {
		log.Fatal(err)
		return
	}
	//开启事务
	tx, _ :=db.Begin()


	defer func() {
		if err := recover(); err != nil {
			//回滚事务
			tx.Rollback()
		}else{
			//提交事务
			tx.Commit()
		}

		db.Close()
	}()







	result, err :=db.Exec("update area set area_name = ? where id=?","jiangxi",5)
	if nil != err {
		log.Fatal(err)
		return
	}

	log.Println(result.RowsAffected())


}

func RunQuery() {
	db, err := Connect("root:fan1988@tcp(127.0.0.1:3306)/sharding_jdbc")
	if err != nil {
		log.Fatal(err)
		return
	}
	//开启事务
	tx, _ :=db.Begin()


	defer func() {
		if err := recover(); err != nil {
			//回滚事务
			tx.Rollback()
		}else{
			//提交事务
			tx.Commit()
		}

		db.Close()
	}()


	stmt, err :=tx.Prepare("select id,area_name from area limit ?")
	if err != nil {
		panic(err)
	}

	defer stmt.Close()

	rows, err := stmt.Query(10)
	if nil != err {
		log.Fatal(err)
		return
	}

	defer rows.Close()

	cts ,_:= rows.ColumnTypes()
	for _,ct := range cts {
		log.Println(ct.DatabaseTypeName())
	}

	var id int
	var areaName string
	for rows.Next() {
		err = rows.Scan(&id, &areaName)
		if nil != err {
			log.Fatal(err)
		}else{
			log.Println(id,areaName)
		}
	}


}
